//exceptionTest1과 차이를 비교하자. 
//main 시작 -> caller 시작 -> 예외 처리했습니다. -main->main종료
//메소드를 호출한다는 것은 내가 할일을 쟤한테 시키는건데 내가 시킨 메소드에서 에러가 나면 반드시 에러가 같이 리턴 되어야 한다. 니가 시킨일 나 못했어ㅠㅠ 라고 알려줘야
//내가 다른 애한테 일을 시킬지 내가 할지를 정할꺼 아냐. 이 개념이 중요하다. 
package exception.basic;
//메인 시작 ->caller 시작 -> null값이 들어와서 널포인트익셉션 발생, 널포인트 익셉션 클래스에 객체를 생성해서 위로 던진다. 그 던진걸 캐취에서 정의한 변수가 잡는다. 
public class ExceptionTest2 {
	//try-catch구문
	
	public void caller(String str){
		System.out.println("caller() start");
	 //예외 발생 가능성이 있는 코드를 삽입, 이 try는 널포인트익셉션이라는 클래스를 던진다. 캐취가 잡지 않으면 이 에러는 JVM까지 날아간다.
		String ss = str.concat("HI");//null.concat(); 널은 뭘 호출하고 그런게 안된다. 널 포인트 익섹셥 발생, 여기서 멈추는게 아니고 호출한 곳으로 돌아간다. 이곳이 바로 에러의 발생지점 
		System.out.println("붙인 결과 : "+ss);
		System.out.println("caller() exit");
	}
	
	public static void main(String[] args) {
		System.out.println("main() start");
		//String str1 = "hello"; 
		String str1 = null; //예제변경
		try{//exception을 메인에서 잡는 방법
		new ExceptionTest2().caller(str1);
		}catch(NullPointerException e){
			System.out.println("예외를 처리했습니다. -main()");
		}
		System.out.println("main() exit");
	}
}

/* 
1.번 예제 main 시작 -> caller 시작 ->붙인결과 hello hi ->caller종료->main종료

2.번 예제 main 시작 -> caller 시작,  예외 메세지
*/
